package com.ydc.ln.tutorial.jndi.test;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

/**
 * ��������ldapl�ӹ������ṩ��ʼ��ldapl�ӵķ�����
 * 
 * @author liaowufeng
 * @version 1.0
 */
public class LdapConnectionFactory {
	// ��ʼ����־������
	static Logger log = Logger.getLogger(LdapConnectionFactory.class.getName());

	/**
	 *�����캯��˽�У���ֹʵ��
	 */
	private LdapConnectionFactory() {
	}

	/**
	 * ��LDAPl�ӳ���ȡ��һ��l��
	 * 
	 * @param poolName
	 *            String l�ӳ���
	 * @env�� l��LDAP��l����Ϣ
	 * @return DirContext
	 */
	public static DirContext getDirContext(String poolName, Env env) {
		// ȡ��Context
		try {
			// ��־��ӡ���������˷���
			// log.debug(Constants.INTOMETHOD + "getDirContext");
			// ��ʼ��Properties����
			Properties mEnv = new Properties();
			// ʹ��LDAP/AD����֤��ʽ
			mEnv.put(Context.AUTHORITATIVE, "true");
			// ʹ��l�ӳ�
			mEnv.put("com.sun.jndi.ldap.connect.pool", "true");
			// �趨LDAP/AD��l�ӹ���
			mEnv.put(Context.INITIAL_CONTEXT_FACTORY, env.factory);
			// �趨LDAP/AD��url��ַ
			mEnv.put(Context.PROVIDER_URL, env.url);
			// �趨l��TimeOut
			if (!StringUtils.isEmpty(env.timeOut)) {
				mEnv.put("com.sun.jndi.ldap.connect.timeout", env.timeOut);
			}
			// �趨��ȫģʽΪsimple��ʽ
			mEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
			// sslͨ�7���
			if (env != null && "ssl".equals(env.securityProtocol)) {
				// �趨����Э��Ϊssl
				mEnv.put(Context.SECURITY_PROTOCOL, env.securityProtocol);
				// ���÷���֤�����ԣ���û�д�֤�齫�޷�ͨ��ssl����AD
				System.setProperty("javax.net.ssl.trustStore",
						env.sslTrustStore);
			}
			// ��ȡ���Ե�½ldap���ʺš�����
			mEnv.put(Context.SECURITY_PRINCIPAL, env.adminUID);
			mEnv.put(Context.SECURITY_CREDENTIALS, env.adminPWD);

			// log.debug(Constants.INIT + "DirContext");
			// ͨ�����l��LDAP/AD
			DirContext ctx = new InitialDirContext(mEnv);
			// log.debug("LdapConnectionFactory:" + Constants.INIT +
			// "DirContext" +Constants.SUCCESS);
			return ctx;

		} catch (NamingException ex) {
			ex.printStackTrace();
			// log.error("LdapConnectionFactory:" + Constants.INIT +
			// "DirContext" +Constants.FAIL);
			log.error(ex.getMessage());
			return null;
		}
	}

	/**
	 * �ر�LDAPl��
	 * 
	 * @param dirContext
	 *            DirContext ��l�ӵ�LDAP��Contextʵ��
	 */
	public static void closeDirContext(DirContext dirContext) {
		try {
			if (dirContext != null)
				dirContext.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			log.error("not close DirContext");
		}
	}

	/**
	 * ��ȡ LDAP ������l�ӵķ���
	 * 
	 * @param env
	 *            l��LDAP��l����Ϣ
	 * @return DirContext - LDAP server��l��
	 */
	public static DirContext getDirContext(Env env) {
		try {
			// ��ʼ��Properties����
			Properties mEnv = new Properties();
			// ʹ��LDAP/AD����֤��ʽ
			mEnv.put(Context.AUTHORITATIVE, "true");
			// �趨LDAP/AD��l�ӹ���
			mEnv.put(Context.INITIAL_CONTEXT_FACTORY, env.factory);
			// �趨LDAP/AD��url��ַ
			mEnv.put(Context.PROVIDER_URL, env.url);
			// �趨l��TimeOut
			if (!StringUtils.isEmpty(env.timeOut)) {
				mEnv.put("com.sun.jndi.ldap.connect.timeout", env.timeOut);
			}
			// �趨��ȫģʽΪsimple��ʽ
			mEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
			// sslͨ�7���
			if (env != null && "ssl".equals(env.securityProtocol)) {
				// �趨����Э��Ϊssl
				mEnv.put(Context.SECURITY_PROTOCOL, env.securityProtocol);
				// ���÷���֤�����ԣ���û�д�֤�齫�޷�ͨ��ssl����AD
				System.setProperty("javax.net.ssl.trustStore",
						env.sslTrustStore);
			}
			// ��ȡ���Ե�½ldap���ʺš�����
			mEnv.put(Context.SECURITY_PRINCIPAL, env.adminUID);
			mEnv.put(Context.SECURITY_CREDENTIALS, env.adminPWD);

			// log.debug(Constants.INIT + "DirContext");
			// ͨ�����l��LDAP/AD
			DirContext ctx = new InitialDirContext(mEnv);
			// log.debug("LdapConnectionFactory:" + Constants.INIT +
			// "DirContext" +Constants.SUCCESS);
			return ctx;

		} catch (NamingException ex) {
			ex.printStackTrace();
			// log.error("LdapConnectionFactory:" + Constants.INIT +
			// "DirContext" +Constants.FAIL);
			log.error(ex.getMessage());
			return null;
		}
	}
}